史诗级猎奇做法。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题意解析:你需要在一个圆中进行 qqq 次操作。每次操作如下:
* 给定两个正整数 x,yx,yx,y。
* 请你判断并输出圆上端点为 x,yx,yx,y 的线是否与其他圆上已有的线相交。
* 如果不相交,请添加这条线。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
显然,这可以转换成区间问题,假设这次添加的线是 [Li,Ri][L_i,R_i][Li ,Ri ],则问题为判断是否有已添加的区间 [Lj,Rj][L_j,R_j][Lj ,Rj ] 使得 Li<Lj<Ri<RjL_i\lt L_j\lt R_i\lt R_jLi <Lj <Ri <Rj 。
显然可以线段树解决。
但众所周知,我不会线段树。
所以我就想到了一个很猎奇的做法。
我们可以查一下左端点和右端点,看看它们所在的所有区间是否相同,如果相同就说明符合题意。
直接 +1+1+1?显然不可以,随便找个反例比如说把一个区间拆成两半就能 hack 了。
我们可以使用异或哈希。
我们给每个区间赋一个随机权值,然后判断两端点的值是否相等即可,如果相等往这个区间异或上权值。显然可以树状数组实现。
显然只要权值值域够大,它的错误率就极小。而且最关键的是,无法通过构造来卡掉这种做法!
时间复杂度:O(qlogn)O(q\log n)O(qlogn)。